# -*- coding: utf-8 -*-

#Descrição: Classe para processar dados CSV
#Data: 23/11/11
#Autor: Luís Costa Nº 6032
#-----------------------------------------------

# Classe para o processamento de dados CSV
import csv
import sys

class ProcessCSV:
    
    #Cria um ficheiro CSV a partir de um dicionário
    #-------------------------
    def create_CSV_from_dict(self,dict):
    
        header = []
        values = []
        
        #Coloca os dados do dicionario em duas listas.
        #Uma para o header do CSV e outra com os dados.
        #--------------------
        for k, v in dict.iteritems():
            header.append(k)
            values.append(v)
        pass
        
        try:
            #Abre o ficheiro CSV para escrita
            #--------------------
            csvWriter = csv.writer(open('HTMLTokens.csv','wb'), 
                        delimiter=',')
            
            #Escreve os dados das listas em duas linhas do CSV
            #---------------------
            csvWriter.writerow(header)
            csvWriter.writerow(values)
        
        except Exception, e:
            print "Erro ao escrever no CSV!\n"
            print "ERRO: " + str(e)
        pass
    pass
    #-------------------------

    #Cria um ficheiro CSV a partir de duas listas
    #---------------------------
    def create_CSV_from_list(self, filename, header, values):
        
        print 'A criar o ficheiro CSV: ' + filename
        try:
            #Abre o ficheiro CSV para escrita
            #--------------------
            csvWriter = csv.writer(open(filename+'.csv','wb'), dialect='excel')
            
            #Escreve os dados das listas no CSV
            #---------------------
            csvWriter.writerow(header)
            
            #Escreve o numero de valores correspondente ao header por linha
            #----------------
            csvWriter.writerows(values)

        except Exception, e:
            print "Erro ao escrever no CSV!\n"
            print "ERRO: " + str(e)
            sys.exit()
        pass
        
        print 'Ficheiro CSV criado com sucesso!'
    pass
    
    #-------------------------
    #Processa os dados de um ficheiro CSV do rebides.
    #Devolve um dicionario de listas com os dados de cada coluna do csv.
    #--------------
    def process_rebides_csv(self, fileName):
        
        #Abre o ficheiro de CSV
        #----------------------
        csvReader = csv.reader(open(fileName, 'rb'), delimiter = ',')
        
        #Cria o dicionario com os dados do header do CSV
        dictData = {'Cod_Docente': [], 'Nome': [], 
                    'Ultimo_Grau': [], 'Curso': [], 
                    'Categoria': [], 'Regime_Tempo': [],
                    'Ano_Lectivo': [], 'Tipo_Estab': [], 
                    'Nome_Estab': []}
        
        #Coloca os dados do CSV nas entradas respectivas do dicionario
        #-------------------------
        csvReader.next()

        for row in csvReader:
            
            csvData = self.unicode_encoder(row)

            dictData['Cod_Docente'].append(csvData[0].encode('utf-8'))
            dictData['Nome'].append(csvData[1].encode('utf-8'))
            dictData['Ultimo_Grau'].append(csvData[2].encode('utf-8'))
            dictData['Curso'].append(csvData[3].encode('utf-8'))
            dictData['Categoria'].append(csvData[4].encode('utf-8'))
            dictData['Regime_Tempo'].append(csvData[5].encode('utf-8'))
            dictData['Ano_Lectivo'].append(csvData[6].encode('utf-8'))
            dictData['Tipo_Estab'].append(csvData[7].encode('utf-8'))
            dictData['Nome_Estab'].append(csvData[8].encode('utf-8'))
        pass
                
        return dictData
    pass
    
    #Código para conseguir converter o texto do CSV para UTF-8.
    #É necessário porque os daos no CSV tem de ser escritos em unicode ou ASCII.
    #---------------------
    def unicode_encoder(self, data):
        
        codedData = []
        for str in data:
            
            tmp = unicode(str, 'utf-8')
            codedData.append(tmp)
        pass
        return codedData
    pass
    
